import { useMemberStore } from "@/stores/modules/member"
import { BaseRequestUrl } from "./properties"
const baseURL = BaseRequestUrl
 
//添加拦截器
const httpInterceptor = {
    invoke(option:UniApp.RequestOptions){
        //非http开头的请求需要拼接地址
        if(!option.url.startsWith('http')){
            option.url = baseURL + option.url
        }
        if(option.url.startsWith('https')){
            option.url = option.url.replace('https','http')
        }
        //请求超时，默认是六十秒
        option.timeout = 120000
        console.log(option)
        //添加小程序请求头标识
        option.header = {
            ...option.header, //如果有原来的请求头，保留原来的请求头后再加上小程序请求头
            'source-client':'miniapp'
        }
        //添加token请求头标识
        const memberStore = useMemberStore()
        const token = memberStore.profile?.token
        if(token){
            option.header.token = token
        }
    }
}
uni.addInterceptor('request',httpInterceptor)
uni.addInterceptor('uploadFile',httpInterceptor)
 
interface Data<T>{
    [x: string]: any
    code:string,
    message:string,
    data:T
}
 
export const sendRequest = <T>(option:UniApp.RequestOptions) => {  //指定泛型，该泛型是有效数据的类型
    return new Promise<Data<T>>((resolve,reject) => {  
        uni.request({
            ...option,
            success(res){
                if(res.statusCode >= 200 && res.statusCode < 300){ //如果是2xx，说明是
                    resolve(res.data as Data<T>)  //后端响应过来的有效数据
                }else if(res.statusCode === 401){
                    // 401错误 -》 清理用户信息，跳转到登录页
                    const memberStore = useMemberStore()
                    memberStore.clearProfile()
                    uni.navigateTo({url:'/pages/login/login'})
                    reject(res)
                }else{
                    //其他错误 -》 根据后端错误信息轻提示
                    uni.showToast({
                        icon:'none',
                        title:(res.data as Data<T>).message || '请求错误'
                    })
                }
            },fail(err){ //响应失败，一般是网络问题
                uni.showToast({
                    icon:'none',
                    title:'网络错误'
                })
                reject(err)
            }
        })
    })
}